package com.express.gateway.common;

import com.express.gateway.manage.enums.StatusCodeEnum;

import io.vertx.core.json.Json;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;

/**
 * 将StatusCodeMsg转换为返回json<br>
 * 返回结果<br>
 * status : 状态码<br>
 * msg : 信息<br>
 * data : 数据<br>
 * 
 * @author flower
 *
 */
public class ResultFormat<T> {
	private int code;// 状态码

	private String msg;// 信息

	private T data;// 数据

	public ResultFormat() {
	}
	public ResultFormat(int code, String msg, T data) {
		super();
		this.msg = msg;
		this.code = code;
		this.data = data;
	}

	/**
	 * 格式化返回结果,code为状态码枚举类,data为数据
	 *
	 * @param code
	 * @param data
	 * @return
	 */
	public static String format(StatusCodeEnum code) {
		ResultFormat result = new ResultFormat(code.getCode(), code.getMsg(), null);
		return result.toJson();
	}

	/**
	 * 格式化返回结果,code为状态码枚举类,data为数据
	 * 
	 * @param code
	 * @param data
	 * @return
	 */
	public static String format(StatusCodeEnum code, Object data) {
		ResultFormat result = new ResultFormat(code.getCode(), code.getMsg(), data);
		return result.toJson();
	}

	/**
	 * 格式化返回结果,code为状态码枚举类,data为数据
	 * 
	 * @param code
	 * @param data
	 * @return
	 */
	public static String format(StatusCodeEnum code, JsonArray data) {
		JsonObject result = new JsonObject();
		result.put("code", code.getCode());
		result.put("msg", code.getMsg());
		if (data == null) {
			data = new JsonArray();
		}
		result.put("data", data);
		return result.toString();
	}

	/**
	 * 格式化返回结果,code为状态码枚举类,data为数据
	 * 
	 * @param code
	 * @param data
	 * @return
	 */
	public static String format(StatusCodeEnum code, JsonObject data) {
		JsonObject result = new JsonObject();
		result.put("code", code.getCode());
		result.put("msg", code.getMsg());
		if (data == null) {
			data = new JsonObject();
		}
		result.put("data", data);
		return result.toString();
	}

	/**
	 * 格式化返回结果其中data为null,code为状态码枚举类
	 * 
	 * @param code
	 * @return
	 */
	public static String formatAsNull(StatusCodeEnum code) {
		JsonObject result = new JsonObject();
		result.put("code", code.getCode());
		result.put("msg", code.getMsg());
		result.putNull("data");
		return result.toString();
	}


	/**
	 * 格式化返回结果其中data为0,code为状态码枚举类
	 * 
	 * @param code
	 * @return
	 */
	public static String formatAsZero(StatusCodeEnum code) {
		JsonObject result = new JsonObject();
		result.put("code", code.getCode());
		result.put("msg", code.getMsg());
		result.put("data", 0);
		return result.toString();
	}

	/**
	 * 格式化返回结果其中data为1,code为状态码枚举类
	 * 
	 * @param code
	 * @return
	 */
	public static String formatAsOne(StatusCodeEnum code) {
		JsonObject result = new JsonObject();
		result.put("code", code.getCode());
		result.put("msg", code.getMsg());
		result.put("data", 1);
		return result.toString();
	}

	/**
	 * 自定义返回结果
	 * 
	 * @param resultFormat
	 * @return
	 */
	public static <T> String formatCustom(ResultFormat<T> resultFormat) {
		return resultFormat.toJson();
	}

	public String toJson() {
		return Json.encode(this);
	}


	public int getCode() {
		return code;
	}

	public ResultFormat<T> setCode(int code) {
		this.code = code;
		return this;
	}

	public String getMsg() {
		return msg;
	}

	public ResultFormat<T> setMsg(String msg) {
		this.msg = msg;
		return this;
	}
	public T getData() {
		return data;
	}

	public ResultFormat<T> setData(T data) {
		this.data = data;
		return this;
	}
}
